知识点名称:服务的启动

编号: K6-3

前驱知识点编号:K6-2,K3-2

作者:刘凤华

讲义内容:

6.3 start方式启动服务

Service最基本的用法就是如何启动一个Service,启动Service的方法和启动Activity很类似,都需要借助Intent来实现,而且通过前面的讲解,我们也知道启动Service的方式有两种:start启动和bind(绑定)启动。

下面我们就通过一个具体的例子来看一下,新建一个Android项目,然后新建一个MyService继承自Service,并重写父类的onCreate()、onStartCommand()和onDestroy()方法,如下所示:

这里只是在onCreate()、onStartCommand()和onDestroy()方法中分别打印了一句话,并没有进行其它任何的操作。 然后打开或新建activity_main.xml作为程序的主布局文件,在布局文件中加入了两个按钮,一个用于启动Service,一个用于停止Service。

代码如下所示:

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

<Button

android:id="@+id/start_service"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="StartService"/>

<Button

android:id="@+id/stop_service"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="StopService"/>

</LinearLayout>

然后打开或新建MainActivity作为程序的主Activity,在里面加入启动Service和停止Service的逻辑,在Start Service按钮的点击事件里,构建一个Intent对象,并调用startService()方法来启动MyService。然后在Stop Serivce按钮的点击事件里,同样构建出了一个Intent对象,并调用stopService()方法来停止MyService。代码如下所示:

publicclassMainActivityextendsActivityimplementsOnClickListener{

privateButtonstartService;

privateButtonstopService;

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

startService=(Button)findViewById(R.id.start_service);

stopService=(Button)findViewById(R.id.stop_service);

startService.setOnClickListener(this);

stopService.setOnClickListener(this);

}

publicvoidonClick(Viewv){

switch(v.getId()){

caseR.id.start_service:

IntentstartIntent=newIntent(this,MyService.class);

startService(startIntent);

break;

caseR.id.stop_service:

IntentstopIntent=newIntent(this,MyService.class);

stopService(stopIntent);

break;

default:

break;

}

}

}

另外需要注意,项目中的每一个Service都必须在AndroidManifest.xml中注册才行,所以还需要编辑AndroidManifest.xml文件,添加如下的代码:

<serviceandroid:name="com.example.servicetest.MyService">

一个简单的带有Service功能的程序就写好了,现运行程序,并点击一下Start Service按钮,可以看到LogCat的打印日志如下:

从运行结果可以看出,当启动一个Service的时候,会调用该Service中的onCreate()和onStartCommand()方法。

再点击一次Start Service按钮呢?这个时候的打印日志如下:

从运行结果看只有onStartCommand()方法执行了,onCreate()方法并没有执行,为什么会这样呢?这也就是我们前面所说的,onCreate()方法只会在Service第一次被创建的时候调用,因此如果当前Service已经被创建过了,不管怎样调用startService()方法,每次都只会有onStartCommand()方法中的打印日志。

如果点击一下Stop Service按钮就可以将MyService停止掉了,也就是被销毁了,运行结果不再赘述。

以上演示了使用start启动和销毁一个Service,从中可以看出,主要启动了Service,就可以在onCreate()或onStartCommand()方法里去执行一些具体的逻辑了。不过这样的Service和Activity的关系并不大,只是Activity通知了Service一下:“你可以启动了。”然后Service就去忙自己的事情了。即使Activity被销毁了,也不影响它已经启动的Service在后台运行。那么有没有什么办法能让它们俩的关联更多一些呢?比如说在Activity中可以指定让Service去执行特定任务,或者服务需要与调用者进行方法调用和数据交互时,应该使用bindService()和unbindService()启动、关闭服务。

下面我们就来看如何在Activity中绑定一个服务。

results matching ""

    No results matching ""